Update pcpu_info hypercall interface
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 12 Nov 2009 11:42:36 +0000 (11:42 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 12 Nov 2009 11:42:36 +0000 (11:42 +0000)
This patch change the XENPF_get_cpuinfo interface to pass only one
pcpu information each hypercall. Also, it replace
xenpf_resource_hotplug with XENPF_cpu_online/offline.

Signed-off-by: Jiang, Yunhong <yunhong.jiang@intel.com>
xen/arch/x86/platform_hypercall.c
xen/arch/x86/x86_64/platform_hypercall.c
xen/include/public/platform.h

index 5e4adb0b3775a5d7660d9e8ea455e1e56fb6d21c..9bde0d057fb28c98c935acc6b878694a7c5f6da4 100644 (file)
@@ -394,91 +394,72 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
 
     case XENPF_get_cpuinfo:
     {
-        int i;
-        struct xenpf_pcpu_info *g_info;
-        struct xen_physical_cpuinfo pcpu;
-        XEN_GUEST_HANDLE(xen_physical_cpuinfo_t) g_cpus;
+        struct xenpf_pcpuinfo *g_info;
 
         g_info = &op->u.pcpu_info;
-        if (g_info->info_num <= 0 )
-        {
-            op->u.pcpu_info.max_present = last_cpu(cpu_present_map);
-            op->u.pcpu_info.max_possible = last_cpu(cpu_possible_map);
-            goto done;
-        }
-
-        guest_from_compat_handle(g_cpus, g_info->info);
 
         spin_lock(&cpu_add_remove_lock);
 
-        ret = -EFAULT;
-        for (i = 0; i < g_info->info_num; i++)
+        if ( (g_info->xen_cpuid >= NR_CPUS) ||
+             (g_info->xen_cpuid < 0) ||
+             !cpu_present(g_info->xen_cpuid) )
         {
-            if (copy_from_guest_offset(&pcpu, g_cpus, i, 1) )
-                goto out;
+            g_info->flags |= XEN_PCPU_FLAGS_INVALID;
+        }
+        else
+        {
+            g_info->apic_id = x86_cpu_to_apicid[g_info->xen_cpuid];
+            g_info->acpi_id = acpi_get_processor_id(g_info->xen_cpuid);
+            ASSERT(g_info->apic_id != BAD_APICID);
+            if (cpu_online(g_info->xen_cpuid))
+                g_info->flags |= XEN_PCPU_FLAGS_ONLINE;
+        }
 
-            if ( (pcpu.xen_cpuid >= NR_CPUS) ||
-                 (pcpu.xen_cpuid < 0) ||
-                 !cpu_present(pcpu.xen_cpuid) )
-            {
-                pcpu.flags |= XEN_PCPU_FLAGS_INVALID;
-            }
-            else
-            {
-                pcpu.apic_id = x86_cpu_to_apicid[pcpu.xen_cpuid];
-                pcpu.acpi_id = acpi_get_processor_id(pcpu.xen_cpuid);
-                ASSERT(pcpu.apic_id != BAD_APICID);
-                if (cpu_online(pcpu.xen_cpuid))
-                    pcpu.flags |= XEN_PCPU_FLAGS_ONLINE;
-            }
+        g_info->max_present = last_cpu(cpu_present_map);
 
-            if ( copy_to_guest_offset(g_cpus, i, &pcpu, 1) )
-                goto out;
-        }
-        op->u.pcpu_info.max_present = last_cpu(cpu_present_map);
-        op->u.pcpu_info.max_possible = last_cpu(cpu_possible_map);
         spin_unlock(&cpu_add_remove_lock);
-done:
+
         ret = copy_to_guest(u_xenpf_op, op, 1) ? -EFAULT : 0;
     }
     break;
 
-    case XENPF_resource_hotplug:
+    case XENPF_cpu_online:
     {
         int cpu;
 
-        switch ( op->u.resource.sub_cmd)
+        cpu = op->u.cpu_ol.cpuid;
+        if (!cpu_present(cpu))
         {
-        case XEN_CPU_online:
-            cpu = op->u.resource.u.cpu_ol.cpuid;
-            if (!cpu_present(cpu))
-            {
-                ret = -EINVAL;
-                break;
-            }
-            else if (cpu_online(cpu))
-            {
-                ret = 0;
-                break;
-            }
+            ret = -EINVAL;
+            break;
+        }
+        else if (cpu_online(cpu))
+        {
+            ret = 0;
+            break;
+        }
+
+        ret = cpu_up(cpu);
+        break;
+    }
+
+    case XENPF_cpu_offline:
+    {
+        int cpu;
 
-            ret = cpu_up(cpu);
+        cpu = op->u.cpu_ol.cpuid;
+        if (!cpu_present(cpu))
+        {
+            ret = -EINVAL;
             break;
-        case XEN_CPU_offline:
-            cpu = op->u.resource.u.cpu_ol.cpuid;
-            if (!cpu_present(cpu))
-            {
-                ret = -EINVAL;
-                break;
-            } else if (!cpu_online(cpu))
-            {
-                ret = 0;
-                break;
-            }
-            ret = continue_hypercall_on_cpu(
-                0, cpu_down_helper, (void *)(unsigned long)cpu);
+        } else if (!cpu_online(cpu))
+        {
+            ret = 0;
             break;
         }
+        ret = continue_hypercall_on_cpu(
+          0, cpu_down_helper, (void *)(unsigned long)cpu);
+        break;
     }
     break;
 
index 9a7a6e9faf24edb42c01b03b5b658a8fa0288e0d..2c9048c2371622c00cced4be54d6b7800a076096 100644 (file)
@@ -23,11 +23,8 @@ DEFINE_XEN_GUEST_HANDLE(compat_platform_op_t);
 #define xen_processor_power_t   compat_processor_power_t
 #define set_cx_pminfo           compat_set_cx_pminfo
 
-DEFINE_XEN_GUEST_HANDLE(compat_physical_cpuinfo_t);
-#define xen_physical_cpuinfo compat_physical_cpuinfo
-#define xen_physical_cpuinfo_t compat_physical_cpuinfo_t
-#define xenpf_pcpu_info compat_pf_pcpu_info
-#define xenpf_pcpu_info_t compat_pf_pcpu_info_t
+#define xenpf_pcpuinfo compat_pf_pcpuinfo
+#define xenpf_pcpuinfo_t compat_pf_pcpuinfo_t
 
 #define xenpf_enter_acpi_sleep compat_pf_enter_acpi_sleep
 
index 1a1cf0873b340fac1855c1df52ae1e3a6b2bc980..ff6837ae1053da24fe8ac98b0da1c33e8fab8139 100644 (file)
@@ -313,55 +313,30 @@ typedef struct xenpf_set_processor_pminfo xenpf_set_processor_pminfo_t;
 DEFINE_XEN_GUEST_HANDLE(xenpf_set_processor_pminfo_t);
 
 #define XENPF_get_cpuinfo 55
-struct xen_physical_cpuinfo {
+struct xenpf_pcpuinfo {
     /* IN */
     uint32_t xen_cpuid;
     /* OUT */
-    uint32_t apic_id;
-    uint32_t acpi_id;
+    /* The maxium cpu_id that is present */
+    uint32_t max_present;
 #define XEN_PCPU_FLAGS_ONLINE   1
     /* Correponding xen_cpuid is not present*/
 #define XEN_PCPU_FLAGS_INVALID  2
     uint32_t flags;
-    uint8_t  pad[128];
-};
-typedef struct xen_physical_cpuinfo xen_physical_cpuinfo_t;
-DEFINE_XEN_GUEST_HANDLE(xen_physical_cpuinfo_t);
-
-/*
- * Fetch physical CPUs information
- */
-struct xenpf_pcpu_info
-{
-    /* OUT */
-    /* The maxium cpu_id that is present */
-    uint32_t max_present;
-    /* The maxium possible cpus */
-    uint32_t max_possible;
-
-    /* IN */
-    uint32_t info_num;
-
-    XEN_GUEST_HANDLE(xen_physical_cpuinfo_t) info;
+    uint32_t apic_id;
+    uint32_t acpi_id;
 };
-typedef struct xenpf_pcpu_info xenpf_pcpu_info_t;
-DEFINE_XEN_GUEST_HANDLE(xenpf_pcpu_info_t);
+typedef struct xenpf_pcpuinfo xenpf_pcpuinfo_t;
+DEFINE_XEN_GUEST_HANDLE(xenpf_pcpuinfo_t);
 
+#define XENPF_cpu_online    56
+#define XENPF_cpu_offline   57
 struct xenpf_cpu_ol
 {
     uint32_t cpuid;
 };
-
-#define XENPF_resource_hotplug 56
-struct xenpf_resource_hotplug {
-    uint32_t sub_cmd;
-#define XEN_CPU_online      1
-#define XEN_CPU_offline     2
-    union {
-        struct xenpf_cpu_ol   cpu_ol;
-        uint8_t               pad[64];
-    }u;
-};
+typedef struct xenpf_cpu_ol xenpf_cpu_ol_t;
+DEFINE_XEN_GUEST_HANDLE(xenpf_cpu_ol_t);
 
 struct xen_platform_op {
     uint32_t cmd;
@@ -378,8 +353,8 @@ struct xen_platform_op {
         struct xenpf_change_freq       change_freq;
         struct xenpf_getidletime       getidletime;
         struct xenpf_set_processor_pminfo set_pminfo;
-        struct xenpf_pcpu_info          pcpu_info;
-        struct xenpf_resource_hotplug   resource;
+        struct xenpf_pcpuinfo          pcpu_info;
+        struct xenpf_cpu_ol            cpu_ol;
         uint8_t                        pad[128];
     } u;
 };